// plugin.h
#ifndef PLUGIN_H
#define PLUGIN_H

#include <stdbool.h>
#include "mpack/mpack.h" // <--- 包含 MPack 头文件以使用 mpack_node_t

// 插件句柄类型
typedef void* PluginHandle;

// 插件信息结构体
typedef struct {
    const char* name;       // 插件名称
    const char* description; // 插件描述
    int api_version;        // 插件 API 版本
} PluginInfo;

// 插件加载函数类型
typedef bool (*PluginLoadFunc)(PluginHandle* handle);

// 插件卸载函数类型
typedef bool (*PluginUnloadFunc)(PluginHandle handle);

// 插件启动函数类型 (修改后)
typedef bool (*PluginStartFunc)(PluginHandle handle, mpack_node_t config_node); // <--- 添加 mpack_node_t 参数

// 插件停止函数类型
typedef bool (*PluginStopFunc)(PluginHandle handle);

// 获取插件信息函数类型
typedef PluginInfo (*PluginGetInfoFunc)();

// --- 插件需要导出的函数原型 ---
// 这些是插件实现者需要提供的函数的 *名称* 和 *签名*
// 插件管理器会通过 dlsym 查找这些带有 "_export" 后缀的函数
// （或者你也可以约定不加后缀，但管理器和插件必须一致）

// 示例导出名称 (与 plugin_manager.c 中的 dlsym 调用匹配)
#define PLUGIN_GET_INFO_EXPORT "get_plugin_info_export"
#define PLUGIN_LOAD_EXPORT     "plugin_load_export"
#define PLUGIN_UNLOAD_EXPORT   "plugin_unload_export"
#define PLUGIN_START_EXPORT    "plugin_start_export"
#define PLUGIN_STOP_EXPORT     "plugin_stop_export"

// --- 插件内部实现的函数声明 (可选，但有助于类型检查) ---
// 这些是插件内部实际函数的声明，它们的签名必须与上面的类型定义匹配。
// 插件开发者在自己的 .c 文件中实现这些函数。

/**
 * @brief 获取插件信息 (由插件实现)
 *
 * @return PluginInfo 包含插件名称、描述和 API 版本
 */
PluginInfo get_plugin_info_export(void); // 匹配 PluginGetInfoFunc

/**
 * @brief 加载插件资源 (由插件实现)
 *
 * @param handle 输出参数，用于存储插件实例的句柄
 * @return true 如果加载成功, false 如果失败
 */
bool plugin_load_export(PluginHandle* handle); // 匹配 PluginLoadFunc

/**
 * @brief 卸载插件资源 (由插件实现)
 *
 * @param handle 要卸载的插件实例句柄
 * @return true 如果卸载成功, false 如果失败
 */
bool plugin_unload_export(PluginHandle handle); // 匹配 PluginUnloadFunc

/**
 * @brief 启动插件 (由插件实现)
 *
 * @param handle 要启动的插件实例句柄
 * @param config_node 传递给插件的 MPack 配置节点
 * @return true 如果启动成功, false 如果失败
 */
bool plugin_start_export(PluginHandle handle, mpack_node_t config_node); // <--- 匹配修改后的 PluginStartFunc

/**
 * @brief 停止插件 (由插件实现)
 *
 * @param handle 要停止的插件实例句柄
 * @return true 如果停止成功, false 如果失败 (通常 stop 不应失败，但保留 bool)
 */
bool plugin_stop_export(PluginHandle handle); // 匹配 PluginStopFunc


// --- 移除旧的、非导出函数声明 ---
/*
PluginInfo get_plugin_info(void);
bool plugin_load(PluginHandle* handle);
bool plugin_unload(PluginHandle handle);
bool plugin_start(PluginHandle handle); // 旧签名
bool plugin_stop(PluginHandle handle);
*/

#endif // PLUGIN_H
